<template>
  <div class="an-box">
    <el-button type="primary" @click="anshow">上传图片</el-button>
    <el-dialog
      title="上传图片"
      :visible.sync="showh"
      width="60%"
      @open="domec"
      center>
        <div style="padding:0 0 20px 0;">
          <!--<div class="show">
            <div class="picture" :style="'backgroundImage:url('+headerImage+')'">
            </div>
          </div>-->
          <div class="an-changepic">
            <div class="an-ch-input">
              <input type="file" id="change" accept="image" @change="change">
              <label for="change"></label>
            </div>
            <el-button type="primary" >选择图片</el-button>
          </div>
        </div>
        <el-row :gutter="20" >
          <el-col :span="14">
            <!-- 裁剪层 -->
            <div class="an-container" >
              <div>
                <img id="image" :src="url" alt="Picture">
              </div>
            </div>
          </el-col>
          <el-col :span="10">
            <!-- 展示区 -->
            <div>效果预览：</div>
            <div class="preview"></div>
            <el-button type="primary" @click="crop">确定</el-button>
          </el-col>
        </el-row>
    </el-dialog>

  </div>
</template>

<script>
  import Cropper from 'cropperjs'
  import img_00 from '@/assets/img/00.jpg'
    export default {
        name: "bannerupdata",
      props: {
          imginfo:{
            imgaspectRatio:'',  //裁剪比例
            imgwidth:'',   //图片宽
            imgtype:''   //图片格式 jpeg/png  默认jpeg
          }
      },
      data () {
        return {
          headerImage:'',  //最后剪裁的图片
          picValue:'',
          cropper:'',
          croppable:false,
          showh:false,
          url:img_00
        }
      },
      methods: {
        anshow(){
          this.showh = true;
        },
        domec(){
          //Dialog 的内容是懒渲染的，即在第一次被打开之前，传入的默认 slot 不会被渲染到 DOM 上。因此，如果需要执行 DOM 操作，或通过 ref 获取相应组件，请在 open 事件回调中进行。
          var image = document.getElementById('image');
          if(image == null){
            setTimeout(() => {
              this.readcrop();
            },0)
          }
        },
        readcrop(){
          //初始化这个裁剪框
          var self = this;
          var image = document.getElementById('image');
          var previews = document.querySelectorAll('.preview');
          var aspectRa = this.imginfo.imgaspectRatio || 1;
          this.cropper = new Cropper(image, {
            aspectRatio: aspectRa, //裁剪比例
            viewMode: 1,       //定义裁剪的视图模式 1为限制图片不超过画布
            dragMode:'move',   //定义拖曳模式  'crop'  'move'   'none'
            zoomable:true,     //启用放大图像
            ready: function () {
              self.croppable = true;
              var clone = this.cloneNode();
              clone.className = '';
              clone.style.cssText = (
                'display: block;' +
                'width: 100%;' +
                'min-width: 0;' +
                'min-height: 0;' +
                'max-width: none;' +
                'max-height: none;'
              );
              self.each(previews, function (elem) {
                elem.innerHTML = '';
                elem.appendChild(clone.cloneNode());
              });
            },
            crop: function (event) {
              var data = event.detail;
              var cropper = this.cropper;
              var imageData = cropper.getImageData();
              var previewAspectRatio = data.width / data.height;
              self.each(previews, function (elem) {
                var previewImage = elem.getElementsByTagName('img').item(0);
                var previewWidth = elem.offsetWidth;
                var previewHeight = previewWidth / previewAspectRatio;
                var imageScaledRatio = data.width / previewWidth;
                elem.style.height = previewHeight + 'px';
                if(previewImage != null){
                  previewImage.style.width = imageData.naturalWidth / imageScaledRatio + 'px';
                  previewImage.style.height = imageData.naturalHeight / imageScaledRatio + 'px';
                  previewImage.style.marginLeft = -data.x / imageScaledRatio + 'px';
                  previewImage.style.marginTop = -data.y / imageScaledRatio + 'px';
                }
              });
            },
          });
        },
        getObjectURL (file) {
          var url = null ;
          if (window.createObjectURL!=undefined) { // basic
            url = window.createObjectURL(file) ;
          } else if (window.URL!=undefined) { // mozilla(firefox)
            url = window.URL.createObjectURL(file) ;
          } else if (window.webkitURL!=undefined) { // webkit or chrome
            url = window.webkitURL.createObjectURL(file) ;
          }
          return url ;
        },
        change (e) {
          let files = e.target.files || e.dataTransfer.files;
          if (!files.length) return;
          this.picValue = files[0];
          this.url = this.getObjectURL(this.picValue);
          //每次替换图片要重新得到新的url
          if(this.cropper){
            this.cropper.replace(this.url);
          }
        },
        each(arr, callback) {
          var length = arr.length;
          var i;
          for (i = 0; i < length; i++) {
            callback.call(arr, arr[i], i, arr);
          }
          return arr;
        },
        crop () {
          this.showh = false;
          var croppedCanvas;
          if (!this.croppable) {
            return;
          }
          // Crop
          var stwidth = this.imginfo.imgwidth || 200;
          var stasp = this.imginfo.imgaspectRatio || 1;
          var stheight = stwidth / stasp;
          var typeimg = this.imginfo.imgtype || 'jpeg';
          var todatatype = 'image/'+typeimg;
          console.log(todatatype);
          croppedCanvas = this.cropper.getCroppedCanvas({
            width: stwidth,   //定义剪裁后的图片尺寸参数
            height: stheight,
            minWidth: 100,
            minHeight: 100,
            maxWidth: 800,
            maxHeight: 800,
            fillColor: '#fff',
            imageSmoothingEnabled: false,
            imageSmoothingQuality: 'high',
          });
          this.headerImage = croppedCanvas.toDataURL(todatatype); //剪裁后图片格式
          this.postImg()
        },
        postImg () {
          //图片数据传递给父组件
          this.$emit('get-img', this.headerImage)
        }
      }
    }
</script>

<style >
.an-container{ height: 350px;}
.preview{overflow: hidden; border: 1px solid #dedede; margin-bottom: 20px;}
.an-changepic{
  margin-top:20px;
  height: 40px;
  position: relative;
}
  .an-changepic .an-ch-input{
    position: absolute;
    z-index: 2;
    opacity: 0;
  }
  .an-changepic .an-ch-input input{
    display: block;
    width: 98px;
    height: 40px;
  }
  .an-changepic button{
    position: absolute;
    top:0;
    left: 0;
    z-index: 1;
  }
#image {
    max-width: 100%;
  }

  /*!
   * Cropper.js v1.0.0-rc
   * https://github.com/fengyuanchen/cropperjs
   *
   * Copyright (c) 2017 Fengyuan Chen
   * Released under the MIT license
   *
   * Date: 2017-03-25T12:02:21.062Z
   */

  .cropper-container {
    font-size: 0;
    line-height: 0;
    position: relative;
    -webkit-user-select: none;
    -moz-user-select: none;
    -ms-user-select: none;
    user-select: none;
    direction: ltr;
    -ms-touch-action: none;
    touch-action: none
  }
  .cropper-container img {
    /* Avoid margin top issue (Occur only when margin-top <= -height) */
    display: block;
    min-width: 0 !important;
    max-width: none !important;
    min-height: 0 !important;
    max-height: none !important;
    width: 100%;
    height: 100%;
    image-orientation: 0deg
  }
  .cropper-wrap-box,
  .cropper-canvas,
  .cropper-drag-box,
  .cropper-crop-box,
  .cropper-modal {
    position: absolute;
    top: 0;
    right: 0;
    bottom: 0;
    left: 0;
  }
  .cropper-wrap-box {
    overflow: hidden;
  }
  .cropper-drag-box {
    opacity: 0;
    background-color: #fff;
  }
  .cropper-modal {
    opacity: .5;
    background-color: #000;
  }
  .cropper-view-box {
    display: block;
    overflow: hidden;
    width: 100%;
    height: 100%;
    outline: 1px solid #39f;
    outline-color: rgba(51, 153, 255, 0.75);
  }
  .cropper-dashed {
    position: absolute;
    display: block;
    opacity: .5;
    border: 0 dashed #eee
  }
  .cropper-dashed.dashed-h {
    top: 33.33333%;
    left: 0;
    width: 100%;
    height: 33.33333%;
    border-top-width: 1px;
    border-bottom-width: 1px
  }
  .cropper-dashed.dashed-v {
    top: 0;
    left: 33.33333%;
    width: 33.33333%;
    height: 100%;
    border-right-width: 1px;
    border-left-width: 1px
  }
  .cropper-center {
    position: absolute;
    top: 50%;
    left: 50%;
    display: block;
    width: 0;
    height: 0;
    opacity: .75
  }
  .cropper-center:before,
  .cropper-center:after {
    position: absolute;
    display: block;
    content: ' ';
    background-color: #eee
  }
  .cropper-center:before {
    top: 0;
    left: -3px;
    width: 7px;
    height: 1px
  }
  .cropper-center:after {
    top: -3px;
    left: 0;
    width: 1px;
    height: 7px
  }
  .cropper-face,
  .cropper-line,
  .cropper-point {
    position: absolute;
    display: block;
    width: 100%;
    height: 100%;
    opacity: .1;
  }
  .cropper-face {
    top: 0;
    left: 0;
    background-color: #fff;
  }
  .cropper-line {
    background-color: #39f
  }
  .cropper-line.line-e {
    top: 0;
    right: -3px;
    width: 5px;
    cursor: e-resize
  }
  .cropper-line.line-n {
    top: -3px;
    left: 0;
    height: 5px;
    cursor: n-resize
  }
  .cropper-line.line-w {
    top: 0;
    left: -3px;
    width: 5px;
    cursor: w-resize
  }
  .cropper-line.line-s {
    bottom: -3px;
    left: 0;
    height: 5px;
    cursor: s-resize
  }
  .cropper-point {
    width: 5px;
    height: 5px;
    opacity: .75;
    background-color: #39f
  }
  .cropper-point.point-e {
    top: 50%;
    right: -3px;
    margin-top: -3px;
    cursor: e-resize
  }
  .cropper-point.point-n {
    top: -3px;
    left: 50%;
    margin-left: -3px;
    cursor: n-resize
  }
  .cropper-point.point-w {
    top: 50%;
    left: -3px;
    margin-top: -3px;
    cursor: w-resize
  }
  .cropper-point.point-s {
    bottom: -3px;
    left: 50%;
    margin-left: -3px;
    cursor: s-resize
  }
  .cropper-point.point-ne {
    top: -3px;
    right: -3px;
    cursor: ne-resize
  }
  .cropper-point.point-nw {
    top: -3px;
    left: -3px;
    cursor: nw-resize
  }
  .cropper-point.point-sw {
    bottom: -3px;
    left: -3px;
    cursor: sw-resize
  }
  .cropper-point.point-se {
    right: -3px;
    bottom: -3px;
    width: 20px;
    height: 20px;
    cursor: se-resize;
    opacity: 1
  }
  @media (min-width: 768px) {
    .cropper-point.point-se {
      width: 15px;
      height: 15px
    }
  }
  @media (min-width: 992px) {
    .cropper-point.point-se {
      width: 10px;
      height: 10px
    }
  }
  @media (min-width: 1200px) {
    .cropper-point.point-se {
      width: 5px;
      height: 5px;
      opacity: .75
    }
  }
  .cropper-point.point-se:before {
    position: absolute;
    right: -50%;
    bottom: -50%;
    display: block;
    width: 200%;
    height: 200%;
    content: ' ';
    opacity: 0;
    background-color: #39f
  }
  .cropper-invisible {
    opacity: 0;
  }
  .cropper-bg {
    background-image: url('');
  }
  .cropper-hide {
    position: absolute;
    display: block;
    width: 0;
    height: 0;
  }
  .cropper-hidden {
    display: none !important;
  }
  .cropper-move {
    cursor: move;
  }
  .cropper-crop {
    cursor: crosshair;
  }
  .cropper-disabled .cropper-drag-box,
  .cropper-disabled .cropper-face,
  .cropper-disabled .cropper-line,
  .cropper-disabled .cropper-point {
    cursor: not-allowed;
  }
</style>
